#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

#define TASK_NUM 10
typedef void(*task_t)();
task_t task[TASK_NUM];

void task1()
{
  printf("任务一\n");
}

void task2()
{
  printf("任务二\n");
}

void task3()
{
  printf("任务三\n");
}

int Addtask(task_t t);

void InitTask()
{
  for(int i=0;i<TASK_NUM;i++)
  {
    task[i]=NULL;
  }
  Addtask(task1);
  Addtask(task2);
  Addtask(task3);
}

int Addtask(task_t t)
{
  int pos=0;
  for(;pos<TASK_NUM;pos++)
  {
    if(!task[pos]) break;
  }
  if(pos==TASK_NUM) return -1;
  task[pos]=t;
  return 0;
}

void ExecuteTask()
{
  for(int i=0;i<TASK_NUM;i++)
  {
    if(!task[i])  continue;
    task[i]();
  }
}


int main()
{
  pid_t id=fork();
  if(id<0)
  {
    perror("fork");
    return 1;
  }
  else if(id==0)
  {
    int cnt=5;
    while(cnt)
    {
      printf("i am child ,pid:%d,ppid:%d,cn:%d\n",getpid(),getppid(),cnt);
      cnt--;
      sleep(1);
    }
  }
  else
  {
      int status=0;
      InitTask();
      while(1)
      { //轮询
        pid_t ret=waitpid(id,&status,WNOHANG);
        if(ret>0)
        {
          //7F:0111 1111
          if(WEXITSTATUS(status))
          {
            printf("代码是正常跑完的,退出码：%d\n",WEXITSTATUS(status));
          }
          else
          {
            printf("代码出现异常\n");
          }
          break;
        }
        else if(ret<0)
        {
          printf("wait fail\n");
          break;
        }
        else
        {
         // printf("你好了没，子进程还没有好，我再等等\n");
          ExecuteTask();
          sleep(1);
        }

      }
    
  }

  return 12;
}




//int main()
//{
//  pid_t id=fork();
//  if(id<0){
//    printf("%s fork error\n",__FUNCTION__);
//    return 1;
//  }
//  else if(id==0){
//    printf("child is run,pid is:%d\n",getpid());
//    sleep(5);
//    exit(1);
//  }
//  else{
//    int status=0;
//    pid_t ret=0;
//    do
//    {
//      ret=waitpid(-1,&status,WNOHANG); //非阻塞式等待
//      if(ret==0)
//      {
//        printf("child is running\n");
//      }
//      sleep(1);
//
//    }while(ret==0);
//
//    if(WIFEXITED(status) &&(ret==id))
//    {
//      printf("wait child 5s success,child return code is:%d\n",WEXITSTATUS(status));
//    }
//    else{
//      printf("wait fail,return\n");
//      return 1;
//    }
//  }
//  return 0;
//}
//



//int main()
//{
//
//  pid_t id=fork();
//  if(id<0){
//    perror("fork");
//    return 1; 
//  }
//  else if(id==0){ //child
//    printf("child is run,pid:%d\n",getpid());
//    sleep(5);
//    exit(257);
//  }
//  else{
//    int status=0;
//    pid_t ret=waitpid(-1,&status,0);//阻塞式等待，等待5s
//    printf("this is test for wait\n");
//    if(WIFEXITED(status)&&(ret==id)){
//      printf("wait child 5s success,child retrun code is %d\n",WEXITSTATUS(status));
//    }
//    else{
//      printf("wait child fail,return\n");
//      return 1;
//    }
//  }
//  return 0;
//}

//
//int main()
//{
//  pid_t id=fork();
//  if(id<0)
//  {
//    perror("fork");
//    return 1;;
//  }
//  else if(id==0)
//  {
//    //child
//   int*p=NULL;
//    int cnt=5;
//    while(cnt)
//    {
//      printf("i am child,pid:%d,ppid:%d\n",getpid(),getppid());
//      cnt--;
//      sleep(1);
//    //  *p=100;
//    }
//    exit(11);
//  }
//  else if(id>0)
//  {
//    //parent
////    int cnt=5;
////    while(cnt)
////    {
////      printf("i am parent,pid:%d,ppid:%d\n",getpid(),getppid());
////      cnt--;
////      sleep(1);
////    }
//
//    int status=0;
//   //int ret=wait(&status);
//   int ret=waitpid(id,&status,0);
//    if(ret>0 &&(status&0X7F)==0) //正常退出
//    {
//      printf("wait success,ret:%d,exit sig:%d,child exit code:%d\n",ret,status&0X7F,(status>>8)&0XFF);
//    }
//    else{//退出异常
//      printf("sig code:%d\n",status&(0X7F));
//    }
//  }
//    
//
//  return 0;
//}
//

//
//#define N 10
//void childRun()
//{
//  int cnt=5;
//  while(cnt)
//  {
//    printf("i am a child process,pid:%d,ppid:%d\n",getpid(),getppid());
//    sleep(1);
//    cnt--;
//  }
//
//}
//
//int main()
//{
//  //wait,waitpid
//  for(int i=0;i<N;i++)
//  {
//    pid_t id=fork();
//    if(id==0)
//    {
//      childRun();
//      exit(0);
//    }
//    printf("creat chlid process:%d seccess\n",id);//只有父进程才会打印
//
//  }
//  //等待
//  for(int i=0;i<N;i++)
//  {
//   // pid_t id=wait(NULL);
//   int status=0;
//    pid_t id=waitpid(id,&status,0);
//    if(id>0)
//    {
//      printf("wait %d success,exit code:%d\n",id,WEXITSTATUS(status));
//    }
//  }
//  return 0;
//}
//int main()
//{
//  int a=1;
//  if(a==1)
//  {
//    exit(1);
//  }
//
//  return 0;
//}
